Link to this headingENS (Ethereum Name Service)

This is a smart contract that provides a way to map names to an address.

Resolve a Name to an Account:

from web3 import Web3 import ens # optional, for convenience (pip install ens) # ---- Connect to Ethereum ---- provider_url = "https://mainnet.infura.io/v3/INFUTA_API_KEY" w3 = Web3(Web3.HTTPProvider(provider_url)) if not w3.is_connected(): raise Exception("Failed to connect to Ethereum node") # ---- ENS Registry Address & ABI ---- ENS_REGISTRY = "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e" ENS_REGISTRY_ABI = [ { "constant": True, "inputs": [{"name": "node", "type": "bytes32"}], "name": "resolver", "outputs": [{"name": "", "type": "address"}], "type": "function", } ] # ---- Resolver ABI ---- RESOLVER_ABI = [ { "constant": True, "inputs": [{"name": "node", "type": "bytes32"}], "name": "addr", "outputs": [{"name": "", "type": "address"}], "type": "function", } ] # ---- Helper: Namehash algorithm ---- def namehash(name: str) -> bytes: """ ENS namehash implementation in Python. """ from eth_utils import keccak node = b"\x00" * 32 if name: labels = name.split(".") for label in reversed(labels): node = keccak(node + keccak(text=label)) return node # ---- Main lookup ---- ens_name = "vitalik.eth" # Step 1: Get resolver from ENS Registry registry_contract = w3.eth.contract(address=ENS_REGISTRY, abi=ENS_REGISTRY_ABI) node = namehash(ens_name) print(f"{ens_name} is converted to {node.hex()}") resolver_address = registry_contract.functions.resolver(node).call() print(f"resolver<0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e>(node_name) -> eth_address") if int(resolver_address, 16) == 0: raise Exception("No resolver set for this ENS name") # Step 2: Query resolver for address resolver_contract = w3.eth.contract(address=resolver_address, abi=RESOLVER_ABI) eth_address = resolver_contract.functions.addr(node).call() print(f"{ens_name} resolves to: {eth_address}") # vitalik.eth is converted to ee6c4522aab0003e8d14cd40a6af439055fd2577951148c14b6cea9a53475835 # resolver<0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e>(node_name) -> eth_address # vitalik.eth resolves to: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045